package com.lihepeng.leecode.perDay;

import org.junit.Test;

/**
 * 2022年5月13日 每日一题
 * medium
 * tag :字符串
 *字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串，编写一个函数判定它们是否只需要一次(或者零次)编辑。
 */
public class Solution0105 {
    public boolean oneEditAway(String first, String second) {
        int f1Lenght = first.length();
        int f2Length = second.length();
        if ((f1Lenght==0||f2Length==0) && Math.abs(f1Lenght-f2Length)==1) {
            return true;
        }
        if (Math.abs(f2Length-f1Lenght)>1) {
            return false;
        }

        //模式等于1 的话表示两个之间字符相同 判断两个字符同等索引是不是相同
        // 模式等于0 表示两个之间差距一个字符 定义一个通用函数来处理改业务
        if (f1Lenght == f2Length) {
            // 判断两个之间是不是只有一个字符不相同
            return handlerMode1(first,second);
        }
        boolean firstLong = f1Lenght>f2Length;
        if (firstLong) {
            return handlerMode0(first,second);
        }else {
            return handlerMode0(second,first);
        }
    }

    /**
     * 计算两个字符串是不是只有一个字符不一致
     * 处理逻辑，如果相同两个索引同时+1 否则长+1 如果任然出现不一致的问题 返回false 否则返回true
     * @param longer
     * @param shorter
     * @return
     */
    private boolean handlerMode0(String longer,String shorter){
        int index1 = 0;
        int index2 = 0;
        while (index2<shorter.length()&& index1<longer.length()) {
            if (longer.charAt(index1) ==shorter.charAt(index2)) {
                index2++;
            }
            index1++;
            if (index1-index2>1) {
                return false;
            }
        }
        return true;
    }
    private boolean handlerMode1(String str1,String str2){
        int resCount = 0;
        for (int i=0;i<str1.length();i++) {
            if (str1.charAt(i) !=str2.charAt(i)) {
                resCount++;
            }
        }
        return resCount<=1;
    }
    @Test
    public void runTest(){
        boolean b = oneEditAway("mart", "karma");
        System.out.println(b);
    }
}
